// 关住作用域，将 构造函数 和 构造函数的原型对象 放置于一个自调用函数中
(function (window,undefined) {
    var that;
    // 创建一个游戏构造函数
    function Game(map) {
        // games 里面有三个属性（food，snakes，stage)
        // 用this.方法添加实例对象，window里面添加过构造函数Food
        // 利用window对象暴露过snake和food,因此函数可以给外部调用
        // 通过 window.new Food()方法来给this.赋值    this.food = new Food();
        this.food = new Food();
        this.snake = new Snake();
        this.stage = stage;
        that = this;
    }
    // 创建Game的构造函数的原型对象// 游戏开始的方法,方法内初始化food和snake
    Game.prototype.start = function () {
        // 将食物和蛇增加到stage上
        this.food.render(this.stage);
        this.food.render(this.stage);
        this.food.render(this.stage);
        this.snake.render(this.stage);
        runSnake();
    }

    // 让游戏开始
    // // 蛇开始运动给蛇的函数添加运动方法，game 拿来调用
    // this.snake.move(this.stage);
    // // 删除前一次渲染的蛇
    // this.snake.remove(this.stage);
    // // 再重新渲染
    // this.snake.render(this.stage);

    // 利用一个私有函数将蛇运动包装起来并且能获取构造函数里的属性和原型对象里的方法
    function runSnake() {
        // 1.让蛇自动运动（定时器作用下自动运动，判断范围是否停止）
        var timer = setInterval(function () {
            // 给蛇的函数添加运动   
            that.snake.move(that.stage);
            // 删除前一次渲染的蛇
            that.snake.remove(that.stage);
            // 再重新渲染
            that.snake.render(that.stage);

            // 判断是否吃到食物了（判断蛇是否与食物碰撞，如果碰撞增长自己的蛇节）
            // 如果蛇的位置与食物的位置相同就是碰撞

            // 获取食物的位置
            // var foodX= that.food.x;
            // var foodY= that.food.y;
            // 增加了食物个数之后,我们需要food 数组中的每一项的位置与蛇的位置比较
            for (var i = 0; i < that.food.arr.length; i++) {
                // 获取蛇的位置
                var hX = that.snake.body[0].x * that.snake.width;
                var hY = that.snake.body[0].y * that.snake.height;
                // 判断
                // if (foodX === hX && foodY === hY) {
                    if (that.food.arr[i].offsetLeft === hX  && that.food.arr[i].offsetTop === hY) {
                    // 如果碰撞
                    // 删除食物
                    that.food.remove(that.stage,i);
                    // 重新渲染一个新的食物
                    that.food.render(that.stage);
                    // 增长自己的蛇节 
                    // 获取body中的最后一项,在最后一项增加一项
                    var last = that.snake.body[that.snake.body.length - 1];
                    that.snake.body.push({
                        x: last.x,
                        y: last.y,
                        color: last.color
                    });
                    }
            }



            // 每次把上述三步执行完就判断一次是否超过范围
            // 定义最大份数
            var maxX = that.stage.offsetWidth / that.snake.width;
            var maxY = that.stage.offsetHeight / that.snake.height;
            // 获得蛇头当前位置
            var headX = that.snake.body[0].x;
            var headY = that.snake.body[0].y;
            if (headX < 0 || headX >= maxX || headY < 0 || headY >= maxY) {
                clearInterval(timer);
                alert("Game over");
            }
        }, 150);
    }
    // 2.蛇根据上下左右按键换方向
    bindkey();
    function bindkey() {
        document.onkeydown = function (e) {
            // console.log(e.keyCode);
            switch (e.keyCode) {
                case 37:
                    that.snake.direction = "left";
                    break;
                case 38:
                    that.snake.direction = "top";
                    break;
                case 39:
                    that.snake.direction = "right";
                    break;
                case 40:
                    that.snake.direction = "bottom";
                    break;

            }
        }
    }
    // 3.蛇与食物是否碰撞
    // 4.是否超出范围


    window.Game = Game;
})(window,undefined);

